/*************************************************************************************
 *
 *	模块名称 : 消息队列操作接口
 *	文件名称 : 03_list.c
 *	版   本 : V1.0
 *	说   明 : 线程邮箱中链表的相应操作函数接口
 *	修改记录 :
 *		     版本号       日期         作者        说明
 *	         V1.0     2023-04-13      rush_long        发布
 *
 *	
 *
 *************************************************************************************/

#include "03_queue.h"

Que *head, *tail;					//队列头节点指针和为节点指针

int init_que(LIST_LINK *list_head)
{
	Que* tmp = malloc(sizeof(Que));					//申请节点空间
	tmp->next = NULL;
	
    list_head->elem.mail_head = list_head->elem.mail_tail = tmp; //给队头和队尾指针赋值

	return 0;
}

int in_queue(LIST_LINK *list_head, MAIL_DATA *data)
{
	Que* tmp = malloc(sizeof(Que));						//申请节点空间
    memcpy(&tmp->data, data, sizeof(MAIL_DATA));		//复制数据
	tmp->next = NULL;
														//将节点接入队尾
    list_head->elem.mail_tail->next = tmp;
    list_head->elem.mail_tail = list_head->elem.mail_tail->next;
	
	return 0;
}

int out_queue(LIST_LINK *list_head, MAIL_DATA *data)
{
    if (list_head->elem.mail_head == list_head->elem.mail_tail)			//判断消息队列是否为空
	{
		printf("queue is empty. \n");
		return -1;
	}

    if (list_head->elem.mail_head->next == list_head->elem.mail_tail)	//判断消息队列是否只有一条消息
	{
        list_head->elem.mail_tail = list_head->elem.mail_head;
	}

    Que* del = list_head->elem.mail_head->next;						//删除头节点
    list_head->elem.mail_head->next = del->next;

    memcpy(data, &del->data, sizeof(MAIL_DATA));					//复制数据
	free(del);

	
    return 0;
}

void destroy(LIST_LINK *list_head)
{
    Que* tmp = list_head->elem.mail_head;				

    while (list_head->elem.mail_head)							//逐个删除节点
	{
        tmp = list_head->elem.mail_head;
        list_head->elem.mail_head = list_head->elem.mail_head->next;
		free(tmp);		
	}
}
